字符类型
类型为 char
的变量可以保存具体实现所用的字符集里的一个字符。例如,
char ch = 'a';
实际情况中一个 char
类型几乎都包含 8
个二进制位,因此它可以保存 256
种不同的值。典型的情况是有关字符集采用ISO-646的某个变形,例如 ASCII,并由此提供了你键盘上的那些字符。这一字符集只是部分地标准化了,由此也引起了许多问题(C.3节)。
在支持不同自然语言的字符集之间存在着巨大的差异,以不同方式支持同一种自然语言的字符集之间也有类似情况。当然,我们在这里只对这些差异如何影响C++感兴趣,怎样在多语言、多字符集的环境中编写程序的事情已经超过了本书的范围,虽然这种事情也会在一些地方向我们招手(20.2节、21.7节、C.3.3节)。
假定实现所用的字符集包括数字、26个英文字母,以及某些基本标点符号是没问题的。而做出如下假定都是不安全的:在 8
位字符集中共有不超过 127
个字符(例如,有的字符集提供了 255
个字符),不存在超出英语的字母(大部分欧洲语言都提供了更多的字母),字母字符是连续排列的(EBCDIC在 'i
' 和 'j
' 之间留有空隙),写C++所需要的每个字符都是可用的(例如,有些国家的字符集中没有提供 {}[]|\
;C.3.1节)。只要有可能,我们都应该避免做出有关对象表示方式的任何假定,这个普遍规则甚至也适用于字符。
每个字符常量有一个整数值。例如,在ASCII字符集里'b
'的值是 98
。这里是一个小程序,它可以告诉你,你仔细输入的任一个字符所对应的整数值是什么
#include <iostream>
int main()
{
char c;
std::cin >> c;
std::cout << "the value of'" << c << "' is " << int(c) << '\n';
}
记法 int(c)
将给出字符 c
的整数值。能够把 char
转为整数也引起了一个问题:一个 char
是有符号的还是没符号的?由8个二进制位表示的256个值可以解释为整数值0~255,或者解释为-128~127。不幸的是,关于普通 char
如何选择的问题是由实现决定的(C.1节、C.3.4节)。C++提供了另外两个类型,它们都确切地回答了这个问题:signed char
保存的值是-128~127;而 unsigned char
保存的值是0~255。幸运的是,这方面的差异只出现在那些超出127的值,而最常用的字符都在127之内。
将超过上述范围的值存入普通的 char
将会导致微妙的移植性问题。如果你真的需要使用不止一种 char
类型,或者你需要将整数存储到 char
中,那么请读一读C.3.4节。
这里还提供了另一个类型 wchar_t
,用于保存更大的字符集里的字符,例如 Unicode
的字符。这是另外一个独立的类型,wchar_t
的大小由实现确定,且保证足够存放具体实现所用的现场(21.7节、C.3.3节)所支持的最大的字符集。这个奇怪的名字来源于C。在C语言里,wchar_t
是一个 typedef
(4.9.7节)而不是一个内部类型。加上后缀 _t
就是为了区分标准类型和 typedef
。
请注意,字符类型都是整型(4.1.1节),可以对它们使用算术和逻辑运算符(6.2节)。
🔚